package com.hyper_yang.javase.reflection_annotation.reflect;

import org.junit.jupiter.api.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/*
反射的角度:
    类对象代表的是这个类，理应能拿到所有的构造器
 */
public class ConstructorTest {
    @Test
    public void test1() {
        Class<Student> studentClass = Student.class;

        // 获取构造器
        // studentClass.getConstructors() 获取类中所有的公开的构造器
        // studentClass.getDeclaredConstructors() 获取类中所有的构造器
        for (Constructor<?> constructor : studentClass.getDeclaredConstructors()) {
            System.out.println(constructor);
        }
    }

    @Test
    public void test2() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Class<Student> studentClass = Student.class;
        // newInstance 是访问无参构造，创建一个对象
        Student student = studentClass.newInstance();
        System.out.println(student);
        // 1、获取类中的有参构造器
        Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class, Integer.class);
        // 2、newInstance(类对象)
        Student student1 = declaredConstructor.newInstance("张三", 23);
        System.out.println(student1);
        // 获取 private修饰的构造器， 能获取，但是不能执行。  可以使用反射 突破封锁
        Constructor<Student> privateConstructor = studentClass.getDeclaredConstructor(String.class);

        // todo: 突破 -- 取消 JVM的访问修饰符的检查
        privateConstructor.setAccessible(true);

        Student student2 = privateConstructor.newInstance("李四");
        System.out.println(student2);
    }

}
